package co.gov.aerocivil.siga.registrarquejaservicioaerolinea.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.event.ValueChangeEvent;
import javax.inject.Inject;
import javax.inject.Named;
import javax.validation.GroupSequence;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.gov.aerocivil.siga.comun.bean.IMensaje;
import co.gov.aerocivil.siga.comun.constantes.ConstantesConversacion;
import co.gov.aerocivil.siga.comun.constantes.entidad.First;
import co.gov.aerocivil.siga.comun.constantes.entidad.Fourth;
import co.gov.aerocivil.siga.comun.constantes.entidad.Second;
import co.gov.aerocivil.siga.comun.constantes.entidad.Third;
import co.gov.aerocivil.siga.comun.excepcion.LogicaExcepcion;
import co.gov.aerocivil.siga.comun.excepcion.SistemaExcepcion;
import co.gov.aerocivil.siga.comun.modelo.administrador.Aerolinea;
import co.gov.aerocivil.siga.comun.modelo.administrador.Aeropuerto;
import co.gov.aerocivil.siga.comun.modelo.administrador.Ciudad;
import co.gov.aerocivil.siga.comun.modelo.administrador.Departamento;
import co.gov.aerocivil.siga.comun.modelo.administrador.Pais;
import co.gov.aerocivil.siga.comun.modelo.administrador.Tipo;
import co.gov.aerocivil.siga.comun.modelo.administrador.TipoDocumento;
import co.gov.aerocivil.siga.comun.modelo.proceso.PersonaEmpresaTemporal;
import co.gov.aerocivil.siga.comun.modelo.quejaaerolinea.Compensacion;
import co.gov.aerocivil.siga.comun.modelo.quejaaerolinea.Evidencia;
import co.gov.aerocivil.siga.comun.modelo.quejaaerolinea.QuejaAerolinea;
import co.gov.aerocivil.siga.comun.modelo.quejaaerolinea.Vuelo;
import co.gov.aerocivil.siga.comun.servicio.administrador.IAeropuertoServicio;
import co.gov.aerocivil.siga.comun.servicio.administrador.ICiudadServicio;
import co.gov.aerocivil.siga.comun.servicio.administrador.IDepartamentoServicio;
import co.gov.aerocivil.siga.comun.servicio.administrador.IPaisServicio;
import co.gov.aerocivil.siga.comun.servicio.administrador.ITipoDocumentoServicio;
import co.gov.aerocivil.siga.comun.servicio.auditoria.ILogError;
import co.gov.aerocivil.siga.comun.util.JSFUtil;
import co.gov.aerocivil.siga.proceso.bean.AIniciadorTramite;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.IAerolineaServicio;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.ICompensacionServicio;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.IReclamacionServicio;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.servicio.IRegistrarQuejaAerolinea;
import co.gov.aerocivil.siga.registrarquejaservicioaerolinea.util.ConstantesValidacion;

/**
 * Backing bean CDI para la actividad de registrar queja aerolinea
 * CU-0179 Registrar queja
 * @author jmgoyes@itc.com.co
 */
@Named
@ConversationScoped
@GroupSequence(value={First.class, Second.class, Third.class, Fourth.class, RegistrarQuejaAerolinea.class})
public class RegistrarQuejaAerolinea extends AIniciadorTramite implements Serializable {

	/**
	 * UID de serializacion
	 */
	private static final long serialVersionUID = 1L;

	/** 
	 * Constante que representa la instancia del Log. 
	 */
	private static final Logger LOG = LoggerFactory
			.getLogger(RegistrarQuejaAerolinea.class);
	
	/**
	 * obtener Inyección CDI de conversación
	 */
	@Inject
	private Conversation conversacion;
	
	/**
	 * Inyección EJB del servicio transversal LogError
	 */
	@EJB
	private ILogError logError;
	
	/**
	 * Inyección CDI del bean de aplicación de Mensajes
	 */
	@Inject
	private IMensaje mensaje;
	
	/**
	 * Lista de tipos de documento
	 */
	private List<TipoDocumento> listaTipoDocumento;
	
	/**
	 * Lista de paises
	 */
	private List<Pais> listaPais;
	
	/**
	 * Lista de departamentos
	 */
	private List<Departamento> listaDepartamento;
	
	/**
	 * Lista de ciudades de residencia
	 */
	private List<Ciudad> listaCiudadResidencia;
	
	/**
	 * Lista de ciudades
	 */
	private List<Ciudad> listaCiudad;
	
	/**
	 * Lista de aeropuertos
	 */
	private List<Aeropuerto> listaAeropuerto;
	
	/**
	 * Lista de aerolineas
	 */
	private List<Aerolinea> listaAerolinea;
	
	/**
	 * Lista de aeropuertos de origen
	 */
	private List<Aeropuerto> listaOrigen;
	
	/**
	 * Lista de aeropuertos de destino
	 */
	private List<Aeropuerto> listaDestino;
	
	/**
	 * Lista de motivos de reclamación
	 */
	private List<Tipo> listaMotivoReclamacion;
	
	/**
	 * Lista de compensaciones recibidas
	 */
	private List<Compensacion> listaCompensacionRecibida;
	
	
	/**
	 * Atributo tipo de documento
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private TipoDocumento tipoDocumento;
	
	/**
	 * Atributo número de documento
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(min = 4, max = 12, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_NUMERO_DOCUMENTO, groups=Third.class)
	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_NUMERO_DOCUMENTO, groups=Fourth.class)
	private String numeroDocumento;
	
	/**
	 * Atributo primer apellido
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_PRIMER_APELLIDO, groups=Third.class)
	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS_ESPACIO, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_PRIMER_APELLIDO, groups=Fourth.class)
	private String primerApellido;
	
	/**
	 * Atributo segundo apellido
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_SEGUNDO_APELLIDO, groups=Third.class)
	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS_ESPACIO, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_SEGUNDO_APELLIDO, groups=Fourth.class)
	private String segundoApellido;
	
	/**
	 * Atributo primer nombre
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_PRIMER_NOMBRE, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS_ESPACIO, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String primerNombre;
	
	/**
	 * Atributo segundo nombre
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_SEGUNDO_NOMBRE, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS_ESPACIO, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String segundoNombre;
	
	/**
	 * Atributo direccion residencia
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_DIRECCION_RESIDENCIA, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String direccionResidencia;
	
	/**
	 * Atributo pais
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Pais pais;
	
	/**
	 * Atributo departamento
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Departamento departamento;
	
	/**
	 * Atributo ciudad de residencia
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Ciudad ciudadResidencia;
	
	/**
	 * Atributo celular
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 30, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_CELULAR, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String celular;
	
	/**
	 * Atributo telefonos
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 30, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_TELEFONOS, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String telefonos;
	
	/**
	 * Atributo correo electrónico
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_CORREO_ELECTRONICO, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String correoElectronico;
	
	/**
	 * Atributo confirmacion correo electrónico
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_CONFIRMACION_CORREO_ELECTRONICO, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String confirmacionCorreoElectronico;
	
	/**
	 * Atributo correo electrónico alterno
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_CORREO_ELECTRONICO_ALTERNO, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String correoElectronicoAlterno;
	
	/**
	 * Atributo confirmación correo electrónico alterno
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_CONFIRMACION_CORREO_ELECTRONICO_ALTERNO, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String confirmacionCorreoElectronicoAlterno;
	
	/**
	 * Atributo fecha de registro de la queja
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	private Date fechaRegistroQueja;
	
	/**
	 * Atributo hora de registro de la queja
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	private String horaRegistroQueja;
	
	/**
	 * Atributo ciudad
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Ciudad ciudad;
	
	/**
	 * Atributo aeropuerto
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Aeropuerto aeropuerto;
	
	/**
	 * Atributo aerolinea
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Aerolinea aerolinea;
	
	/**
	 * Atributo fecha vuelo de los hechos
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	private Date fechaVueloDeLosHechos;
	
	/**
	 * Atributo hora del vuelo
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	private String horaVuelo;
	
	/**
	 * Atributo numero del vuelo
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 100, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_NUMERO_VUELO, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String numeroVuelo;
	
	/**
	 * Atributo aeropuerto de origen
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Aeropuerto origen;
	
	/**
	 * Atributo aeropuerto de destino
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Aeropuerto destino;
	
	/**
	 * Atributo tratectoria de conexion
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 200, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_TRAYECTORIA_CONEXION, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String trayectoConexion;
	
	/**
	 * Atributo motivo de reclamación
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Tipo motivoReclamacion;
	
	/**
	 * Atributo relato de los hechos ocurridos
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO, groups=First.class)
	@NotEmpty(message = ConstantesValidacion.MSJ_REQUERIDO, groups=Second.class)
	@Size(max = 4000, message = ConstantesValidacion.REGISTRAR_QUEJA_TAMANO_EXCEDIDO_RELATO_HECHOS_OCURRIDOS, groups=Third.class)
//	@Pattern(regexp = ConstantesValidacion.PATRON_NUMEROS_LETRAS_MAYUSCULAS, message = ConstantesValidacion.REGISTRAR_QUEJA_CARACTER_NO_PERMITIDO_, groups=Fourth.class)
	private String relatoHechosOcurridos;
	
	/**
	 * Atributo compensación recibida
	 */
	@NotNull(message = ConstantesValidacion.MSJ_REQUERIDO)
	private Compensacion compensacionRecibida;
	
	/**
	 * Inyección de servicio Registrar Queja Aerolinea
	 */
	@EJB
	private IRegistrarQuejaAerolinea registrarQuejaAerolinea;

	/**
	 * DTO queja aerolinea
	 */
	private QuejaAerolinea quejaAerolinea = new QuejaAerolinea();
	
	
	/**
	 * AerolineaServicio inyectado 
	 */
	@EJB
	private IAerolineaServicio aerolineaServicio;
	
	/**
	 * AeropuertoServicio inyectado
	 */
	@EJB
	private IAeropuertoServicio aeropuertoServicio;
	
	/**
	 * CiudadServicio inyectado
	 */
	@EJB
	private ICiudadServicio ciudadServicio;
	
	/**
	 * CompensacionServicio inyectado
	 */
	@EJB
	private ICompensacionServicio compensacionServicio;
	
	/**
	 * DepartamentoServicio inyectado
	 */
	@EJB
	private IDepartamentoServicio departamentoServicio;
	
	/**
	 * ReclamacionServicio inyectado
	 */
	@EJB
	private IReclamacionServicio reclamacionServicio;
		
	/**
	 * PaisServicio inyectado
	 */
	@EJB
	private IPaisServicio paisServicio;
	
	/**
	 * TipoDocumentoServicio inyectado
	 */
	@EJB
	private ITipoDocumentoServicio tipoDocumentoServicio;

	/**
	 * PostConstruct del bean
	 */
	@PostConstruct
	public void creacion() {
		LOG.info("Creación del bean Registrar Queja Aerolinea");
		iniciarConversacion();
		obtenerDatos();
		LOG.info("Finalización creación del bean Registrar Queja Aerolinea");
	}

	/**
	 * Inicio de conversacion
	 */
	public void iniciarConversacion() {
		try {
			LOG.info("Iniciando conversación Registrar Queja Aerolinea");
			if (conversacion.isTransient()) {
				conversacion.begin();
				conversacion
						.setTimeout(ConstantesConversacion.CONVERSACION_TIMEOUT_POR_DEFECTO);

			}
			LOG.info("Finalización iniciación de la conversación Registrar Queja Aerolinea. Id conversación: "
					+ conversacion.getId());
		} catch (SistemaExcepcion es) {
			long codigo = logError.log(es.getMessage(), es, LOG);
			JSFUtil.agregarMensajeError(es.getMessage() + ConstantesValidacion.CODIGO + codigo);
		} catch (RuntimeException er) {
			long codigo = logError
					.log(mensaje
							.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_INICIO_REGISTRAR_QUEJA),
							er, LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_INICIO_REGISTRAR_QUEJA)
					+ ConstantesValidacion.CODIGO + codigo);
		}
	}
	
	/**
	 * PreDestroy del bean
	 */
	@PreDestroy
	public void destroy() {
		LOG.info("Destrucción del bean Registrar Queja Aerolinea");
		LOG.info("Finalización destrucción del bean Registrar Queja Aerolinea");
	}
	
	/**
	 * Inicia el tramite Registrar Queja Aerolinea
	 */
	public void iniciarProceso() {
		try {
			LOG.info("Iniciando proceso Registrar Queja Aerolinea");

			LOG.info("Finalizando conversación por el usuario");
			conversacion.end();
			LOG.info("Conversación finalizada por el usuario");

			LOG.info("Finalización proceso Registrar Queja Aerolinea");
		} catch (SistemaExcepcion es) {
			long codigo = logError.log(es.getMessage(), es, LOG);
			JSFUtil.agregarMensajeError(es.getMessage() + ConstantesValidacion.CODIGO + codigo);
		} catch (RuntimeException er) {
			long codigo = logError
					.log(mensaje
							.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_INICIO_TRAMITE),
							er, LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_INICIO_TRAMITE)
					+ ConstantesValidacion.CODIGO + codigo);
		}
	}
	
	@Override
	public void obtenerDatos() {
		LOG.info("Iniciando obtenerDatos()");
		List<Compensacion> compensaciones = null;
		List<Tipo> reclamaciones = null;
		try {
			
			List<Aerolinea> obtenerTodasAerolineas = aerolineaServicio.obtenerTodasAerolineas();
			LOG.info("DEBUG. Número aerolineas: "+obtenerTodasAerolineas!=null?obtenerTodasAerolineas.size()+"":"0");
			this.setListaAerolinea(obtenerTodasAerolineas);
			
			List<Aeropuerto> aeropuetos = aeropuertoServicio.buscarTodosAeropuerto();
			this.setListaAeropuerto(aeropuetos);
			this.setListaDestino(aeropuetos);
			this.setListaOrigen(aeropuetos);
			
			List<Ciudad> ciudades = ciudadServicio.buscarTodos();
			this.setListaCiudad(ciudades);
			
			compensaciones = compensacionServicio.obtenerTodosCompensacion();
			LOG.info("DEBUG. Número compensaciones: "+compensaciones!=null?compensaciones.size()+"":"0");
			this.setListaCompensacionRecibida(compensaciones);
			
			reclamaciones = reclamacionServicio.obtenerTodosMotivosReclamacion();
			LOG.info("DEBUG. Número reclamaciones: "+reclamaciones!=null?reclamaciones.size()+"":"0");
			this.setListaMotivoReclamacion(reclamaciones);
			
			List<Pais> paises = paisServicio.buscarTodos();
			this.setListaPais(paises);
			
			List<TipoDocumento> tiposDocumento = tipoDocumentoServicio.buscarTodos();
			this.setListaTipoDocumento(tiposDocumento);
			
			this.setListaCiudadResidencia(new ArrayList<Ciudad>());
			this.setListaDepartamento(new ArrayList<Departamento>());
		} catch (SistemaExcepcion es) {
			logError.log(es.getMessage(), LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA));
		} catch (RuntimeException er) {
			logError.log(er.getMessage(), LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA));
		} catch (LogicaExcepcion e) {
			logError.log(e.getMessage(), LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA));
		}
		LOG.info("Finalizando obtenerDatos() comp: " + compensaciones!=null?compensaciones.size()+"":"0");
	}
	
	@Override
	public void guardarDatos(String idInstanciaProceso) {
		LOG.info("Iniciando guardarDatos");
		try {
			cargaDatos();
			
			registrarQuejaAerolinea.guardarQueja(quejaAerolinea);
			
			JSFUtil.agregarMensajeCorrecto(mensaje
					.obtenerMensaje(ConstantesValidacion.MSJ_REGISTRAR_QUEJA_CORRECTO));
			
		} catch (SistemaExcepcion es) {
			long codigo = logError
					.log(mensaje
							.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO),
							es, LOG);
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO)
					+ ConstantesValidacion.CODIGO + codigo);
		} catch (LogicaExcepcion le) {
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO)
					+ ". " + le.getMessage());

		} catch (RuntimeException er) {
			LOG.error(er.getMessage());
			JSFUtil.agregarMensajeError(er.getMessage());
		}
		LOG.info("Finalizandos guardarDatos");
	}

	/**
	 * Metodo que carga los datos de la pantalla en el DTO para poder
	 * almacenarlos
	 */
	private void cargaDatos() {
		LOG.info("Iniciando cargaDatos");
		try {
			PersonaEmpresaTemporal pasajero = new PersonaEmpresaTemporal();
			pasajero.setTipoDocumento(tipoDocumento);
			pasajero.setNumeroDocumento(numeroDocumento);
			pasajero.setPrimerApellido(primerApellido);
			pasajero.setSegundoApellido(segundoApellido);
			pasajero.setPrimerNombre(primerNombre);
			pasajero.setSegundoNombre(segundoNombre);
			pasajero.setDireccion(direccionResidencia);
			pasajero.setCiudad(ciudadResidencia);
			pasajero.setCelular(celular);
			pasajero.setTelefono(telefonos);
			pasajero.setCorreoElectronico(correoElectronico);
			pasajero.setConfirmacionCorreoElectronico(confirmacionCorreoElectronico);
			pasajero.setCorreoElectronicoAlterno(correoElectronicoAlterno);
			pasajero.setConfirmacionCorreoElectronicoAlt(confirmacionCorreoElectronicoAlterno);
			quejaAerolinea.setPasajero(pasajero);
			
			quejaAerolinea.setFechaRegistro(fechaRegistroQueja);
			
			Vuelo vuelo = new Vuelo();
			vuelo.setCiudad(ciudad);
			vuelo.setAeropuerto(aeropuerto);
			vuelo.setAerolinea(aerolinea);
			vuelo.setFechaHechos(fechaVueloDeLosHechos);
			vuelo.setNumeroVuelo(numeroVuelo);
			vuelo.setAeropuertoOrigen(origen);
			vuelo.setAeropuertoDestino(destino);
			vuelo.setTrayectoConexion(trayectoConexion);
			quejaAerolinea.setVuelo(vuelo);
			
			//TODO: lista de reclamaciones seleccion multiple
			List<Tipo> listaReclamaciones = new ArrayList<Tipo>();
			listaReclamaciones.add(this.motivoReclamacion);
			quejaAerolinea.setReclamaciones(listaReclamaciones);
			
			quejaAerolinea.setRelatoHechos(relatoHechosOcurridos);
			
			//TODO: lista de compensaciones seleccion multiple
			List<Compensacion> listaCompensaciones = new ArrayList<Compensacion>();
			listaCompensaciones.add(compensacionRecibida);
			quejaAerolinea.setCompensaciones(listaCompensaciones);
			
			//TODO: lista de evidencias
			List<Evidencia> listaEvidencias = null;
			quejaAerolinea.setEvidencias(listaEvidencias);
			
		} catch (SistemaExcepcion es) {
			logError.log(es.getMessage(), LOG);
			JSFUtil.agregarMensajeError(es.getMessage());
			throw es;
		} catch (RuntimeException er) {
			JSFUtil.agregarMensajeError(mensaje
					.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_GUARDAR_INGRESAR_CERTIFICADO));

		}
		LOG.info("Finalizando cargaDatos");
	}
	
	/**
	 * ValueChangeEvent para cargar la lista de departamentos por pais
	 * @param evento Evento
	 */
	public void listarDepartamentoPorPais(ValueChangeEvent evento) {
		LOG.info("Iniciando listarDepartamentoPorPais");
		try {
			pais = (Pais) evento.getNewValue();
			
			listaDepartamento = new ArrayList<Departamento>();
			if (pais != null && pais.getId() != null) {
				listaDepartamento = departamentoServicio.buscarDepartamento(pais);
			} 
		} catch(SistemaExcepcion e) {
			long codigo = logError.log(e.getMessage(), e, LOG);
			JSFUtil.agregarMensajeError(e.getMessage() + ConstantesValidacion.CODIGO + codigo);
		} catch(RuntimeException e) {
			logError.log(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA), LOG);
			JSFUtil.agregarMensajeError(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA));
		}	
		LOG.info("Finalizando listarDepartamentoPorPais");
	}
	
	/**
	 * ValueChangeEvent para cargar la lista de ciudades de residencia por departamento
	 * @param evento Evento
	 */
	public void listarCiudadesPorDepartamento(ValueChangeEvent evento) {
		LOG.info("Iniciando listarCiudadesPorDepartamento");
		try {
			departamento = (Departamento) evento.getNewValue();
			
			listaCiudadResidencia = new ArrayList<Ciudad>();
			if (departamento != null && departamento.getId() != null) {
				listaCiudadResidencia = ciudadServicio.buscarCiudad(departamento);
			} 
		} catch(SistemaExcepcion e) {
			long codigo = logError.log(e.getMessage(), e, LOG);
			JSFUtil.agregarMensajeError(e.getMessage() + ConstantesValidacion.CODIGO + codigo);
		} catch(RuntimeException e) {
			logError.log(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA), LOG);
			JSFUtil.agregarMensajeError(mensaje.obtenerMensaje(ConstantesValidacion.ERROR_SISTEMA_OBTENER_DATOS_REGISTRA_QUEJA));
		}	
		LOG.info("Finalizando listarCiudadesPorDepartamento");
	}

	/**
	 * Obtiene el valor para el atributo aerolinea
	 * @return the aerolinea
	 */
	public Aerolinea getAerolinea() {
		return aerolinea;
	}

	/**
	 * Define un valor para el atributo aerolinea
	 * @param aerolinea the aerolinea to set
	 */
	public void setAerolinea(Aerolinea aerolinea) {
		this.aerolinea = aerolinea;
	}

	/**
	 * Obtiene el valor para el atributo conversacion
	 * @return the conversacion
	 */
	public Conversation getConversacion() {
		return conversacion;
	}

	/**
	 * Define un valor para el atributo conversacion
	 * @param conversacion the conversacion to set
	 */
	public void setConversacion(Conversation conversacion) {
		this.conversacion = conversacion;
	}

	/**
	 * Obtiene el valor para el atributo logError
	 * @return the logError
	 */
	public ILogError getLogError() {
		return logError;
	}

	/**
	 * Define un valor para el atributo logError
	 * @param logError the logError to set
	 */
	public void setLogError(ILogError logError) {
		this.logError = logError;
	}

	/**
	 * Obtiene el valor para el atributo mensaje
	 * @return the mensaje
	 */
	public IMensaje getMensaje() {
		return mensaje;
	}

	/**
	 * Define un valor para el atributo mensaje
	 * @param mensaje the mensaje to set
	 */
	public void setMensaje(IMensaje mensaje) {
		this.mensaje = mensaje;
	}

	/**
	 * Obtiene el valor para el atributo listaTipoDocumento
	 * @return the listaTipoDocumento
	 */
	public List<TipoDocumento> getListaTipoDocumento() {
		return listaTipoDocumento;
	}

	/**
	 * Define un valor para el atributo listaTipoDocumento
	 * @param listaTipoDocumento the listaTipoDocumento to set
	 */
	public void setListaTipoDocumento(List<TipoDocumento> listaTipoDocumento) {
		this.listaTipoDocumento = listaTipoDocumento;
	}

	/**
	 * Obtiene el valor para el atributo listaPais
	 * @return the listaPais
	 */
	public List<Pais> getListaPais() {
		return listaPais;
	}

	/**
	 * Define un valor para el atributo listaPais
	 * @param listaPais the listaPais to set
	 */
	public void setListaPais(List<Pais> listaPais) {
		this.listaPais = listaPais;
	}

	/**
	 * Obtiene el valor para el atributo listaDepartamento
	 * @return the listaDepartamento
	 */
	public List<Departamento> getListaDepartamento() {
		return listaDepartamento;
	}

	/**
	 * Define un valor para el atributo listaDepartamento
	 * @param listaDepartamento the listaDepartamento to set
	 */
	public void setListaDepartamento(List<Departamento> listaDepartamento) {
		this.listaDepartamento = listaDepartamento;
	}

	/**
	 * Obtiene el valor para el atributo listaCiudadResidencia
	 * @return the listaCiudadResidencia
	 */
	public List<Ciudad> getListaCiudadResidencia() {
		return listaCiudadResidencia;
	}

	/**
	 * Define un valor para el atributo listaCiudadResidencia
	 * @param listaCiudadResidencia the listaCiudadResidencia to set
	 */
	public void setListaCiudadResidencia(List<Ciudad> listaCiudadResidencia) {
		this.listaCiudadResidencia = listaCiudadResidencia;
	}

	/**
	 * Obtiene el valor para el atributo listaCiudad
	 * @return the listaCiudad
	 */
	public List<Ciudad> getListaCiudad() {
		return listaCiudad;
	}

	/**
	 * Define un valor para el atributo listaCiudad
	 * @param listaCiudad the listaCiudad to set
	 */
	public void setListaCiudad(List<Ciudad> listaCiudad) {
		this.listaCiudad = listaCiudad;
	}

	/**
	 * Obtiene el valor para el atributo listaAeropuerto
	 * @return the listaAeropuerto
	 */
	public List<Aeropuerto> getListaAeropuerto() {
		return listaAeropuerto;
	}

	/**
	 * Define un valor para el atributo listaAeropuerto
	 * @param listaAeropuerto the listaAeropuerto to set
	 */
	public void setListaAeropuerto(List<Aeropuerto> listaAeropuerto) {
		this.listaAeropuerto = listaAeropuerto;
	}

	/**
	 * Obtiene el valor para el atributo listaAerolinea
	 * @return the listaAerolinea
	 */
	public List<Aerolinea> getListaAerolinea() {
		return listaAerolinea;
	}

	/**
	 * Define un valor para el atributo listaAerolinea
	 * @param listaAerolinea the listaAerolinea to set
	 */
	public void setListaAerolinea(List<Aerolinea> listaAerolinea) {
		this.listaAerolinea = listaAerolinea;
	}

	/**
	 * Obtiene el valor para el atributo listaOrigen
	 * @return the listaOrigen
	 */
	public List<Aeropuerto> getListaOrigen() {
		return listaOrigen;
	}

	/**
	 * Define un valor para el atributo listaOrigen
	 * @param listaOrigen the listaOrigen to set
	 */
	public void setListaOrigen(List<Aeropuerto> listaOrigen) {
		this.listaOrigen = listaOrigen;
	}

	/**
	 * Obtiene el valor para el atributo listaDestino
	 * @return the listaDestino
	 */
	public List<Aeropuerto> getListaDestino() {
		return listaDestino;
	}

	/**
	 * Define un valor para el atributo listaDestino
	 * @param listaDestino the listaDestino to set
	 */
	public void setListaDestino(List<Aeropuerto> listaDestino) {
		this.listaDestino = listaDestino;
	}

	/**
	 * Obtiene el valor para el atributo listaMotivoReclamacion
	 * @return the listaMotivoReclamacion
	 */
	public List<Tipo> getListaMotivoReclamacion() {
		return listaMotivoReclamacion;
	}

	/**
	 * Define un valor para el atributo listaMotivoReclamacion
	 * @param listaMotivoReclamacion the listaMotivoReclamacion to set
	 */
	public void setListaMotivoReclamacion(List<Tipo> listaMotivoReclamacion) {
		this.listaMotivoReclamacion = listaMotivoReclamacion;
	}

	/**
	 * Obtiene el valor para el atributo listaCompensacionRecibida
	 * @return the listaCompensacionRecibida
	 */
	public List<Compensacion> getListaCompensacionRecibida() {
		return listaCompensacionRecibida;
	}

	/**
	 * Define un valor para el atributo listaCompensacionRecibida
	 * @param listaCompensacionRecibida the listaCompensacionRecibida to set
	 */
	public void setListaCompensacionRecibida(
			List<Compensacion> listaCompensacionRecibida) {
		this.listaCompensacionRecibida = listaCompensacionRecibida;
	}

	/**
	 * Obtiene el valor para el atributo tipoDocumento
	 * @return the tipoDocumento
	 */
	public TipoDocumento getTipoDocumento() {
		return tipoDocumento;
	}

	/**
	 * Define un valor para el atributo tipoDocumento
	 * @param tipoDocumento the tipoDocumento to set
	 */
	public void setTipoDocumento(TipoDocumento tipoDocumento) {
		this.tipoDocumento = tipoDocumento;
	}

	/**
	 * Obtiene el valor para el atributo numeroDocumento
	 * @return the numeroDocumento
	 */
	public String getNumeroDocumento() {
		return numeroDocumento;
	}

	/**
	 * Define un valor para el atributo numeroDocumento
	 * @param numeroDocumento the numeroDocumento to set
	 */
	public void setNumeroDocumento(String numeroDocumento) {
		this.numeroDocumento = numeroDocumento;
	}

	/**
	 * Obtiene el valor para el atributo primerApellido
	 * @return the primerApellido
	 */
	public String getPrimerApellido() {
		return primerApellido;
	}

	/**
	 * Define un valor para el atributo primerApellido
	 * @param primerApellido the primerApellido to set
	 */
	public void setPrimerApellido(String primerApellido) {
		this.primerApellido = primerApellido;
	}

	/**
	 * Obtiene el valor para el atributo segundoApellido
	 * @return the segundoApellido
	 */
	public String getSegundoApellido() {
		return segundoApellido;
	}

	/**
	 * Define un valor para el atributo segundoApellido
	 * @param segundoApellido the segundoApellido to set
	 */
	public void setSegundoApellido(String segundoApellido) {
		this.segundoApellido = segundoApellido;
	}

	/**
	 * Obtiene el valor para el atributo primerNombre
	 * @return the primerNombre
	 */
	public String getPrimerNombre() {
		return primerNombre;
	}

	/**
	 * Define un valor para el atributo primerNombre
	 * @param primerNombre the primerNombre to set
	 */
	public void setPrimerNombre(String primerNombre) {
		this.primerNombre = primerNombre;
	}

	/**
	 * Obtiene el valor para el atributo segundoNombre
	 * @return the segundoNombre
	 */
	public String getSegundoNombre() {
		return segundoNombre;
	}

	/**
	 * Define un valor para el atributo segundoNombre
	 * @param segundoNombre the segundoNombre to set
	 */
	public void setSegundoNombre(String segundoNombre) {
		this.segundoNombre = segundoNombre;
	}

	/**
	 * Obtiene el valor para el atributo direccionResidencia
	 * @return the direccionResidencia
	 */
	public String getDireccionResidencia() {
		return direccionResidencia;
	}

	/**
	 * Define un valor para el atributo direccionResidencia
	 * @param direccionResidencia the direccionResidencia to set
	 */
	public void setDireccionResidencia(String direccionResidencia) {
		this.direccionResidencia = direccionResidencia;
	}

	/**
	 * Obtiene el valor para el atributo pais
	 * @return the pais
	 */
	public Pais getPais() {
		return pais;
	}

	/**
	 * Define un valor para el atributo pais
	 * @param pais the pais to set
	 */
	public void setPais(Pais pais) {
		this.pais = pais;
	}

	/**
	 * Obtiene el valor para el atributo departamento
	 * @return the departamento
	 */
	public Departamento getDepartamento() {
		return departamento;
	}

	/**
	 * Define un valor para el atributo departamento
	 * @param departamento the departamento to set
	 */
	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	/**
	 * Obtiene el valor para el atributo ciudadResidencia
	 * @return the ciudadResidencia
	 */
	public Ciudad getCiudadResidencia() {
		return ciudadResidencia;
	}

	/**
	 * Define un valor para el atributo ciudadResidencia
	 * @param ciudadResidencia the ciudadResidencia to set
	 */
	public void setCiudadResidencia(Ciudad ciudadResidencia) {
		this.ciudadResidencia = ciudadResidencia;
	}

	/**
	 * Obtiene el valor para el atributo celular
	 * @return the celular
	 */
	public String getCelular() {
		return celular;
	}

	/**
	 * Define un valor para el atributo celular
	 * @param celular the celular to set
	 */
	public void setCelular(String celular) {
		this.celular = celular;
	}

	/**
	 * Obtiene el valor para el atributo telefonos
	 * @return the telefonos
	 */
	public String getTelefonos() {
		return telefonos;
	}

	/**
	 * Define un valor para el atributo telefonos
	 * @param telefonos the telefonos to set
	 */
	public void setTelefonos(String telefonos) {
		this.telefonos = telefonos;
	}

	/**
	 * Obtiene el valor para el atributo correoElectronico
	 * @return the correoElectronico
	 */
	public String getCorreoElectronico() {
		return correoElectronico;
	}

	/**
	 * Define un valor para el atributo correoElectronico
	 * @param correoElectronico the correoElectronico to set
	 */
	public void setCorreoElectronico(String correoElectronico) {
		this.correoElectronico = correoElectronico;
	}

	/**
	 * Obtiene el valor para el atributo confirmacionCorreoElectronico
	 * @return the confirmacionCorreoElectronico
	 */
	public String getConfirmacionCorreoElectronico() {
		return confirmacionCorreoElectronico;
	}

	/**
	 * Define un valor para el atributo confirmacionCorreoElectronico
	 * @param confirmacionCorreoElectronico the confirmacionCorreoElectronico to set
	 */
	public void setConfirmacionCorreoElectronico(
			String confirmacionCorreoElectronico) {
		this.confirmacionCorreoElectronico = confirmacionCorreoElectronico;
	}

	/**
	 * Obtiene el valor para el atributo correoElectronicoAlterno
	 * @return the correoElectronicoAlterno
	 */
	public String getCorreoElectronicoAlterno() {
		return correoElectronicoAlterno;
	}

	/**
	 * Define un valor para el atributo correoElectronicoAlterno
	 * @param correoElectronicoAlterno the correoElectronicoAlterno to set
	 */
	public void setCorreoElectronicoAlterno(String correoElectronicoAlterno) {
		this.correoElectronicoAlterno = correoElectronicoAlterno;
	}

	/**
	 * Obtiene el valor para el atributo confirmacionCorreoElectronicoAlterno
	 * @return the confirmacionCorreoElectronicoAlterno
	 */
	public String getConfirmacionCorreoElectronicoAlterno() {
		return confirmacionCorreoElectronicoAlterno;
	}

	/**
	 * Define un valor para el atributo confirmacionCorreoElectronicoAlterno
	 * @param confirmacionCorreoElectronicoAlterno the confirmacionCorreoElectronicoAlterno to set
	 */
	public void setConfirmacionCorreoElectronicoAlterno(
			String confirmacionCorreoElectronicoAlterno) {
		this.confirmacionCorreoElectronicoAlterno = confirmacionCorreoElectronicoAlterno;
	}

	/**
	 * Obtiene el valor para el atributo fechaRegistroQueja
	 * @return the fechaRegistroQueja
	 */
	public Date getFechaRegistroQueja() {
		return fechaRegistroQueja;
	}

	/**
	 * Define un valor para el atributo fechaRegistroQueja
	 * @param fechaRegistroQueja the fechaRegistroQueja to set
	 */
	public void setFechaRegistroQueja(Date fechaRegistroQueja) {
		this.fechaRegistroQueja = fechaRegistroQueja;
	}

	/**
	 * Obtiene el valor para el atributo horaRegistroQueja
	 * @return the horaRegistroQueja
	 */
	public String getHoraRegistroQueja() {
		return horaRegistroQueja;
	}

	/**
	 * Define un valor para el atributo horaRegistroQueja
	 * @param horaRegistroQueja the horaRegistroQueja to set
	 */
	public void setHoraRegistroQueja(String horaRegistroQueja) {
		this.horaRegistroQueja = horaRegistroQueja;
	}

	/**
	 * Obtiene el valor para el atributo ciudad
	 * @return the ciudad
	 */
	public Ciudad getCiudad() {
		return ciudad;
	}

	/**
	 * Define un valor para el atributo ciudad
	 * @param ciudad the ciudad to set
	 */
	public void setCiudad(Ciudad ciudad) {
		this.ciudad = ciudad;
	}

	/**
	 * Obtiene el valor para el atributo aeropuerto
	 * @return the aeropuerto
	 */
	public Aeropuerto getAeropuerto() {
		return aeropuerto;
	}

	/**
	 * Define un valor para el atributo aeropuerto
	 * @param aeropuerto the aeropuerto to set
	 */
	public void setAeropuerto(Aeropuerto aeropuerto) {
		this.aeropuerto = aeropuerto;
	}

	/**
	 * Obtiene el valor para el atributo fechaVueloDeLosHechos
	 * @return the fechaVueloDeLosHechos
	 */
	public Date getFechaVueloDeLosHechos() {
		return fechaVueloDeLosHechos;
	}

	/**
	 * Define un valor para el atributo fechaVueloDeLosHechos
	 * @param fechaVueloDeLosHechos the fechaVueloDeLosHechos to set
	 */
	public void setFechaVueloDeLosHechos(Date fechaVueloDeLosHechos) {
		this.fechaVueloDeLosHechos = fechaVueloDeLosHechos;
	}

	/**
	 * Obtiene el valor para el atributo horaVuelo
	 * @return the horaVuelo
	 */
	public String getHoraVuelo() {
		return horaVuelo;
	}

	/**
	 * Define un valor para el atributo horaVuelo
	 * @param horaVuelo the horaVuelo to set
	 */
	public void setHoraVuelo(String horaVuelo) {
		this.horaVuelo = horaVuelo;
	}

	/**
	 * Obtiene el valor para el atributo numeroVuelo
	 * @return the numeroVuelo
	 */
	public String getNumeroVuelo() {
		return numeroVuelo;
	}

	/**
	 * Define un valor para el atributo numeroVuelo
	 * @param numeroVuelo the numeroVuelo to set
	 */
	public void setNumeroVuelo(String numeroVuelo) {
		this.numeroVuelo = numeroVuelo;
	}

	/**
	 * Obtiene el valor para el atributo origen
	 * @return the origen
	 */
	public Aeropuerto getOrigen() {
		return origen;
	}

	/**
	 * Define un valor para el atributo origen
	 * @param origen the origen to set
	 */
	public void setOrigen(Aeropuerto origen) {
		this.origen = origen;
	}

	/**
	 * Obtiene el valor para el atributo destino
	 * @return the destino
	 */
	public Aeropuerto getDestino() {
		return destino;
	}

	/**
	 * Define un valor para el atributo destino
	 * @param destino the destino to set
	 */
	public void setDestino(Aeropuerto destino) {
		this.destino = destino;
	}

	/**
	 * Obtiene el valor para el atributo trayectoConexion
	 * @return the trayectoConexion
	 */
	public String getTrayectoConexion() {
		return trayectoConexion;
	}

	/**
	 * Define un valor para el atributo trayectoConexion
	 * @param trayectoConexion the trayectoConexion to set
	 */
	public void setTrayectoConexion(String trayectoConexion) {
		this.trayectoConexion = trayectoConexion;
	}

	/**
	 * Obtiene el valor para el atributo motivoReclamacion
	 * @return the motivoReclamacion
	 */
	public Tipo getMotivoReclamacion() {
		return motivoReclamacion;
	}

	/**
	 * Define un valor para el atributo motivoReclamacion
	 * @param motivoReclamacion the motivoReclamacion to set
	 */
	public void setMotivoReclamacion(Tipo motivoReclamacion) {
		this.motivoReclamacion = motivoReclamacion;
	}

	/**
	 * Obtiene el valor para el atributo relatoHechosOcurridos
	 * @return the relatoHechosOcurridos
	 */
	public String getRelatoHechosOcurridos() {
		return relatoHechosOcurridos;
	}

	/**
	 * Define un valor para el atributo relatoHechosOcurridos
	 * @param relatoHechosOcurridos the relatoHechosOcurridos to set
	 */
	public void setRelatoHechosOcurridos(String relatoHechosOcurridos) {
		this.relatoHechosOcurridos = relatoHechosOcurridos;
	}

	/**
	 * Obtiene el valor para el atributo compensacionRecibida
	 * @return the compensacionRecibida
	 */
	public Compensacion getCompensacionRecibida() {
		return compensacionRecibida;
	}

	/**
	 * Define un valor para el atributo compensacionRecibida
	 * @param compensacionRecibida the compensacionRecibida to set
	 */
	public void setCompensacionRecibida(Compensacion compensacionRecibida) {
		this.compensacionRecibida = compensacionRecibida;
	}

	/**
	 * Obtiene el valor para el atributo registrarQuejaAerolinea
	 * @return the registrarQuejaAerolinea
	 */
	public IRegistrarQuejaAerolinea getRegistrarQuejaAerolinea() {
		return registrarQuejaAerolinea;
	}

	/**
	 * Define un valor para el atributo registrarQuejaAerolinea
	 * @param registrarQuejaAerolinea the registrarQuejaAerolinea to set
	 */
	public void setRegistrarQuejaAerolinea(
			IRegistrarQuejaAerolinea registrarQuejaAerolinea) {
		this.registrarQuejaAerolinea = registrarQuejaAerolinea;
	}

	/**
	 * Obtiene el valor para el atributo quejaAerolinea
	 * @return the quejaAerolinea
	 */
	public QuejaAerolinea getQuejaAerolinea() {
		return quejaAerolinea;
	}

	/**
	 * Define un valor para el atributo quejaAerolinea
	 * @param quejaAerolinea the quejaAerolinea to set
	 */
	public void setQuejaAerolinea(QuejaAerolinea quejaAerolinea) {
		this.quejaAerolinea = quejaAerolinea;
	}

	/**
	 * Obtiene el valor para el atributo aerolineaServicio
	 * @return the aerolineaServicio
	 */
	public IAerolineaServicio getAerolineaServicio() {
		return aerolineaServicio;
	}

	/**
	 * Define un valor para el atributo aerolineaServicio
	 * @param aerolineaServicio the aerolineaServicio to set
	 */
	public void setAerolineaServicio(IAerolineaServicio aerolineaServicio) {
		this.aerolineaServicio = aerolineaServicio;
	}

	/**
	 * Obtiene el valor para el atributo aeropuertoServicio
	 * @return the aeropuertoServicio
	 */
	public IAeropuertoServicio getAeropuertoServicio() {
		return aeropuertoServicio;
	}

	/**
	 * Define un valor para el atributo aeropuertoServicio
	 * @param aeropuertoServicio the aeropuertoServicio to set
	 */
	public void setAeropuertoServicio(IAeropuertoServicio aeropuertoServicio) {
		this.aeropuertoServicio = aeropuertoServicio;
	}

	/**
	 * Obtiene el valor para el atributo ciudadServicio
	 * @return the ciudadServicio
	 */
	public ICiudadServicio getCiudadServicio() {
		return ciudadServicio;
	}

	/**
	 * Define un valor para el atributo ciudadServicio
	 * @param ciudadServicio the ciudadServicio to set
	 */
	public void setCiudadServicio(ICiudadServicio ciudadServicio) {
		this.ciudadServicio = ciudadServicio;
	}

	/**
	 * Obtiene el valor para el atributo compensacionServicio
	 * @return the compensacionServicio
	 */
	public ICompensacionServicio getCompensacionServicio() {
		return compensacionServicio;
	}

	/**
	 * Define un valor para el atributo compensacionServicio
	 * @param compensacionServicio the compensacionServicio to set
	 */
	public void setCompensacionServicio(ICompensacionServicio compensacionServicio) {
		this.compensacionServicio = compensacionServicio;
	}

	/**
	 * Obtiene el valor para el atributo departamentoServicio
	 * @return the departamentoServicio
	 */
	public IDepartamentoServicio getDepartamentoServicio() {
		return departamentoServicio;
	}

	/**
	 * Define un valor para el atributo departamentoServicio
	 * @param departamentoServicio the departamentoServicio to set
	 */
	public void setDepartamentoServicio(IDepartamentoServicio departamentoServicio) {
		this.departamentoServicio = departamentoServicio;
	}

	/**
	 * Obtiene el valor para el atributo reclamacionServicio
	 * @return the reclamacionServicio
	 */
	public IReclamacionServicio getReclamacionServicio() {
		return reclamacionServicio;
	}

	/**
	 * Define un valor para el atributo reclamacionServicio
	 * @param reclamacionServicio the reclamacionServicio to set
	 */
	public void setReclamacionServicio(IReclamacionServicio reclamacionServicio) {
		this.reclamacionServicio = reclamacionServicio;
	}

	/**
	 * Obtiene el valor para el atributo paisServicio
	 * @return the paisServicio
	 */
	public IPaisServicio getPaisServicio() {
		return paisServicio;
	}

	/**
	 * Define un valor para el atributo paisServicio
	 * @param paisServicio the paisServicio to set
	 */
	public void setPaisServicio(IPaisServicio paisServicio) {
		this.paisServicio = paisServicio;
	}

	/**
	 * Obtiene el valor para el atributo tipoDocumentoServicio
	 * @return the tipoDocumentoServicio
	 */
	public ITipoDocumentoServicio getTipoDocumentoServicio() {
		return tipoDocumentoServicio;
	}

	/**
	 * Define un valor para el atributo tipoDocumentoServicio
	 * @param tipoDocumentoServicio the tipoDocumentoServicio to set
	 */
	public void setTipoDocumentoServicio(
			ITipoDocumentoServicio tipoDocumentoServicio) {
		this.tipoDocumentoServicio = tipoDocumentoServicio;
	}

}
